home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Arsenal / OS2 Arsenal v1.0 (Disc 2)(Arsenal Computer).ISO / os2_inet / progcsd.exe / READH32.ME < prev    next >
Text File  |  1992-11-13  |  8KB  |  224 lines

  1. TCPH32 PACKAGE
  2.  
  3. User Documentation
  4.  
  5. John McGarvey 11/13/92
  6.  
  7. These C header files provided for the TCP/IP for OS/2 programmer's toolkit
  8. are intended for use with Microsoft C 6.0 and IBM C Set/2.  This version is
  9. being made publicly available to customers as a CSD for the toolkit.
  10.  
  11. 32 bit TCP/IP OS/2 applications can be created with C Set/2 using this
  12. package.  Such applications can call these 16 bit dynamic link libraries:
  13.  
  14. TCPIPDLL.DLL
  15. RPCDLL.DLL
  16. FAPIDLL.DLL  (new with this package).
  17.  
  18. 32 bit applications can call all sockets, FTP, and RPC APIs.  SNMP DPI and
  19. the Kerberos and NCS APIs have not been enabled for 32 bit applications.
  20.  
  21. To use this package, you must first install the TCP/IP for OS/2
  22. Programmer's Toolkit. If this package was obtained as a CSD for that
  23. toolkit, it is installed using the standard procedure for CSDs.  If
  24. it was obtained as a ZIP file from CompuServe, or via FTP from
  25. software.watson.ibm.com, it should be unpacked using the command:
  26.  
  27. pkunzip -d tcph32.zip d:\
  28.  
  29. where d: is the drive on which OS/2 tcpip has been installed.
  30.  
  31. This will replace some of the header files in the programmer's toolkit
  32. with new files that are compatible with C Set/2.  The new header files
  33. can also be used with Microsoft C 6.0 to create 16 bit applications.
  34. Applications created to call the existing DLLs will continue to work with
  35. future releases of TCP/IP for OS/2, as these DLLs will still be shipped.
  36.  
  37. 32 bit applications using this package will still call 16 bit DLLs.
  38. A full 32 bit implementation of the TCP/IP APIs is planned.
  39.  
  40. Now, it would be nice if the programmer did not need to know that her 32
  41. bit application is calling a 16 bit DLL, but unfortunately she does need
  42. to know in some cases, and the source code will differ, in small ways,
  43. from what it would be for true 32 bit APIs.  Here are some examples:
  44.  
  45. /* Wrong: int sockets[3]; Right: */
  46. short sockets[3];
  47.  
  48. select(sockets,1,1,1,5000);
  49.  
  50. The 16 bit DLLs expect 16 bit integers, whereas an int is 32 bits wide in
  51. C Set/2.  Therefore it is important to use short instead of int.  Note
  52. also that a full 32 bit implementation of select() would require int
  53. instead of short.
  54.  
  55. This call traps:
  56.  
  57. printf("%s",inet_ntoa(in));
  58.  
  59. This call works:
  60.  
  61. printf("%s",(char *)inet_ntoa(in));
  62.  
  63. This is because inet_ntoa returns a char * _Seg16, and not a char *, so the
  64. cast is necessary to tell the compiler to "thunk", that is, to convert from
  65. a 16:16 pointer to a 0:32 pointer.  In most cases, C Set/2 will give
  66. compiler errors if you try to pass the wrong kind of pointer or if you
  67. provide a function with the wrong linkage type.  The printf() example above
  68. is an exception, because C Set/2 does not know what type is expected as a
  69. parameter to printf().
  70.  
  71. Always use /NOI in linking to the TCP/IP DLLs, as the entry points are
  72. lower case.  Compile with the /Sp1 or /Sp2 switch.  This switch is needed
  73. because, by default, C Set/2 aligns structure members on four byte
  74. boundaries, whereas 16 bit compilers align on 2 byte boundaries. Link
  75. with one or more of the libraries tcpipdll.lib, fapidll.lib, and
  76. rpcdll.lib.
  77.  
  78. Please report any problems with this package by calling customer support:
  79.  
  80.    support number: 1-800-237-5511
  81.    TCP/IP component ID: 5798RXW00
  82.  
  83. Help can also be obtained by submitting questions to OS2TCPIP CFORUM
  84. on IBMLINK, or use "go OS2DF2" (section 5 is TCP/IP) on CompuServe.
  85.  
  86. Addendum: Creating 32 bit RPC applications
  87.  
  88. One can create 32 bit RPC applications that call the 16 bit APIs, but it
  89. requires special attention to issues of mixed model programming.  32 bit
  90. RPC programs that call the 16 bit RPCDLL.DLL will typically have callbacks,
  91. i.e.  the 16 bit code must call the 32 bit code.  So, the 32 bit code must
  92. provide a 16 bit entry point.  This can be done as follows:
  93.  
  94. void _Far16 _Cdecl dumytcpprog( struct svc_req * _Seg16 rqstp_t,
  95.    SVCXPRT * _Seg16 transp_t) {
  96. // whatever
  97. }
  98.  
  99. SVCXPRT transp_t;
  100.  
  101. svc_register(transp_t,30000,1,dumytcpprog,0);
  102.  
  103. The _Far16 _Cdecl tells C Set/2 to create a 16 bit entry point, and the
  104. _Seg16 qualifiers tell the code to expect 16:16 pointers to be passed as
  105. parameters.  These statements are needed to create an entry point the 16
  106. bit RPCDLL.DLL can call as a result of svc_register().
  107.  
  108. Take special care when passing pointers to pointers as parameters in
  109. function calls.  Here is an example:
  110.  
  111. char *psza,*pszb,*hostname;
  112. char * _Seg16 psz16a, * _Seg16 psz16b;
  113.  
  114. psza="sample string";
  115. pszb=(char *)malloc(500);
  116. psz16a=psza;
  117. psz16b=pszb;
  118. hostname="thishost";
  119.  
  120. error = callrpc(hostname,ARRAYRCVPROG,VERSION,ARRAYRCVPROC,
  121.   xdr_wrapstring,(char *)&psz16a,xdr_wrapstring,(char *)&psz16b);
  122.  
  123. The compiler will convert the pointer to hostname correctly, as the
  124. prototype for callrpc() tells it what to do.  Also, it will correctly
  125. pass 16 bit pointers to psz16a, psz16b, and the function xdr_wrapstring.
  126. But if psz16a and psz16b are not themselves 16 bit pointers, the
  127. compiler will not know to convert them.  A working example is given
  128. below.
  129.  
  130. client.c
  131.  
  132. /* LICENSED MATERIALS - PROPERTY OF IBM                */
  133. /* THIS PRODUCT CONTAINS "RESTRICTED MATERIALS OF IBM" */
  134. /* 5685-061 (C) COPYRIGHT IBM CORP. 1989               */
  135. /* ALL RIGHTS RESERVED.                                */
  136. /* US Government Users Restricted Rights  -            */
  137. /* Use, duplication or disclosure restricted           */
  138. /* by GSA ADP Schedule Contract with IBM Corp.         */
  139. /* SEE COPYRIGHT INSTRUCTIONS, G120-2083               */
  140.  
  141. #include <stdlib.h>
  142. #include <stdio.h>
  143. #include <string.h>
  144. #include <rpc\rpctypes.h>
  145. #include <rpc\rpc.h>
  146. #include <sys\socket.h>
  147. #include <netdb.h>
  148. #include <rpc\pmap_pro.h>
  149. #include <rpc\pmap_cln.h>
  150.  
  151. int main(int argc, char **argv)
  152. {
  153.    enum clnt_stat error;
  154.    char *argg;
  155.    char *argh;
  156.    char * _Seg16 argg16;
  157.    char * _Seg16 argv216;
  158.  
  159.    argg= malloc(1000);
  160.    argh = malloc(1000);
  161.    argg16=argg;
  162.    argv216=argv[2];
  163.    if (argc != 3) {
  164.       fprintf(stderr,"usage: arraysnd hostname word\n");
  165.       exit (-1);
  166.    } /* endif */
  167.     strcpy(argh, argv[2]);
  168.     printf("before callrpc\n");
  169.  
  170.     error = callrpc(argv[1],ARRAYRCVPROG,VERSION,ARRAYRCVPROC,
  171.                    xdr_wrapstring,(char *)&argv216,xdr_wrapstring,(char *)&argg16);
  172.    printf("error=%d\n",error);
  173.    if (error != RPC_SUCCESS) {
  174.       clnt_perrno(error);
  175.       exit(1);
  176.    } /* endif */
  177.  
  178.    printf("test :%s value sent: %s   value received: %s\n",argv[2],argh,argg);
  179.    exit(0);
  180. }
  181.  
  182. server.c
  183.  
  184. /* LICENSED MATERIALS - PROPERTY OF IBM                */
  185. /* THIS PRODUCT CONTAINS "RESTRICTED MATERIALS OF IBM" */
  186. /* 5685-061 (C) COPYRIGHT IBM CORP. 1989               */
  187. /* ALL RIGHTS RESERVED.                                */
  188. /* US Government Users Restricted Rights  -            */
  189. /* Use, duplication or disclosure restricted           */
  190. /* by GSA ADP Schedule Contract with IBM Corp.         */
  191. /* SEE COPYRIGHT INSTRUCTIONS, G120-2083               */
  192. #include <stdlib.h>
  193. #include <stdio.h>
  194. #include <string.h>
  195. #include <rpc\rpctypes.h>
  196. #include <rpc\rpc.h>
  197. #include <sys\socket.h>
  198. #include <netdb.h>
  199. #include <rpc\pmap_pro.h>
  200. #include <rpc\pmap_cln.h>
  201.  
  202.  
  203. void * _Seg16 _Far16 _Cdecl arrayrcv(char * _Seg16 * _Seg16 in)
  204. {
  205.    char *out;
  206.  
  207.    printf("array received: %s\n",(char *)*in);
  208.    out = *in;
  209.    printf("array being returned: %s\n",out);
  210.    return (in);
  211. }
  212.  
  213. int main(int argc,char **argv) {
  214.  
  215.    registerrpc(ARRAYRCVPROG,VERSION,ARRAYRCVPROC,arrayrcv,xdr_wrapstring,
  216.                xdr_wrapstring);
  217.    printf("Arrayrcv Registration with Port Mapper completed\n");
  218.  
  219.    svc_run();
  220.    printf("Error:svc_run returned!\n");
  221.    return 0;
  222. }
  223.  
  224.